package org.atguigu.moudle06spconsumer.listener;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;


@Component
@Slf4j
public class MyMessageListener {
    public static final String QUEUE_NAME = "queue.order";

    @RabbitListener(queues = QUEUE_NAME)
    public void processMessage(String dataString, Message message, Channel channel) throws IOException {
        try {
            log.info("消息：" + dataString);
            //成功返回ack信息,表示信息处理成功,第一个参数表示消息的唯一标识，第二个消息表示不批处理消息，只处理当前消息
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            //获取消息是否时重复投递的消息。true,表示当前消息已经重复投递过一次了
            Boolean redelivered = message.getMessageProperties().getRedelivered();
            if (redelivered) {
                //直接丢弃,重复入队列的消息
                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
            } else {
                //第一次处理失败，重新放回队列
                //失败返回nack信息,表示信息处理失败。前两个参数同上，最后一个参数true表示重新放回队列,false表示不重新放回队列(会丢弃该消息)
                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
            }
            //basicReject和basicNack都是返回nack信号量，区别就是basicReject没有批量操作的标识
            //channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
        }
    }
}
